package top.rainf.support;

import lombok.extern.slf4j.Slf4j;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;

/**
 * 我发现生成图片的事情完全可以交给一个独立类做，控制器只要管调用服务，和网络交互就行了。
 *
 * 这么说这个内部类可以直接放进service之类的。
 * 或者以我之见，可以放进support包，至于它本身就只有在CaptchaController用，无所谓了。
 */
@Slf4j
public class VerifyCodeGenerator{
    /**
     * 生成指定长度的验证码
     *
     * @param len 验证码的长度（英文字母个数）
     * @return 生成的验证码，String类型
     */

    static char[] letters;

    static {
        String s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
                "abcdefghijklmnopqrstuvwxyz" +
                "0123456789";
        letters = s.toCharArray();
    }

    public static String generateVerifyCode(int len){
        //使用系统当前时间作为随机种子
        Random random = new Random(System.currentTimeMillis());
        //生成4个大写英文字母
        //为了避免浪费时间，使用定长字符数组接受生成字母，并使用String构造方法生成一次String
        char[] buffer = new char[len];
        //生成len次限制在0~26内的数字，并将它们加上'A'，强转为字母，置入buffer
        //使用循环，同时利用下标
        for (int i = 0; i < len; i++) {
            //生成数字,nextInt[0,26)
            int chIdx = random.nextInt(letters.length);
            //转换装入buffer
            buffer[i] = letters[chIdx];
        }
        //生成字符串
        //返回该字符串
        String code = new String(buffer);
        log.info("生成了一个长度为{}的验证码：{}",len,code);
        return code;
    }

    public static BufferedImage generateVerifyCodeImage(String code){

        ////生成图片
        //图片配置
        BufferedImage image = new BufferedImage(150,50,BufferedImage.TYPE_INT_RGB);
        //创建空白图片,获取画笔
        Graphics2D g = image.createGraphics();
        //绘画图片内容
        //画上文字，再画上线条
        //设置文字大小
        g.setColor(Color.white);
        g.fillRect(0,0,image.getWidth(),image.getHeight());
        g.setColor(Color.black);
        Font font = new Font("微软雅黑",Font.ITALIC,30);
        g.setFont(font);
        g.drawString(code,30,32);
        //画上干扰项
        Random random = new Random(System.currentTimeMillis());
        //从左到右以间隔随机画四条线
        for (int i = 0; i < 4; i++) {
            g.drawLine(i * random.nextInt(20),
                    i * random.nextInt(20),
                    image.getWidth() ,
                    i * random.nextInt(20)
            );
        }
        return image;
    }

    /**
     * 生成验证码文字版，可能的方法有，配置验证码的长度、内容文字，颜色、文字宽度，背景颜色，干扰样式等。
     * 为了赶紧做出成品，先按简单的做，
     * 验证码的长度影响图片的大小，所以暂时先做固定大小的验证码
     * @return
     */
    //private String generateVerifyCode() {
    //
    //}
}

/**
 *这个类终于没有用上
 * @param textLen
 * @param textType
 */
 record VerifyImageGenerateConfig(int textLen,int textType) {
    VerifyImageGenerateConfig{
        if(textLen > 8 || textLen < 1){
            throw new IllegalArgumentException("验证码长度应在1~8位");
        }
        if(textType != 0 && textType != 1){
            throw new IllegalArgumentException("不支持此类型验证码");
        }
    }
}